package siruna.WE.rendering;

import java.io.File;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;

import com.nitobi.phonegap.PhoneGap;

import siruna.WE.R;
import siruna.WE.Global;
import siruna.WE.FileManager.FileManager;
import siruna.WE.core.XML.XmlReader;
import siruna.WE.settings.Settings;

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * Klasse die een widget effectief gaat tonen aan de gebruiker
 * 
 * @author Tim
 * 
 */
public class WidgetView extends Activity {
	HashMap<String, Integer> views;
	// layout
	LinearLayout layout;
	// settings mogelijk maken
	private Settings gap;

	// settings
	private HashMap<String, String> arg;
	// webview, gebruikt op de widget weer te geven
	private WebView wv;
	// variable nodig voor de settings
	private File f;
	// als je op dit momment de settings weergeeft
	private boolean inSettings = false;
	// de htmlcode van een widget
	private String html;
	// log variable
	private static final String LOG_TAG = "DroidGap";

	private Handler mHandler = new Handler();

	// encodeing en mimetype van de webview
	String mimeType = "text/html";
	String encoding = "utf-8";

	// toestel eigen functies aanspreken, Camera en GPS
	private PhoneGap phonegap;

	//timer die zorgt voor een meldign wanneer het laden te lang duurt.
	private Timer timer;
	
	//textview
	private TextView tv;

	/**
	 * Wordt opgeroepen wanneer de activiteit voor het eerst aangemaakt wordt
	 */
	public void onCreate(Bundle savedInstanceState) {
		//timer configurern en starten
		timer = new Timer();
		timer.schedule(new TimerTask() {
			public void run() {
				updatecount();
			}
		}, 2000);
		// Log.i("TEST", "timer gestart");

		super.onCreate(savedInstanceState);
		setContentView(R.layout.widgetview);

		layout = new LinearLayout(this);
		layout.setOrientation(LinearLayout.HORIZONTAL);
		final ProgressBar pb = new ProgressBar(this);
		tv = new TextView(this);
		tv.setText("Widget is loading...");
		layout.addView(pb);
		layout.addView(tv);
		setContentView(layout);

		String widgetId = getIntent().getStringExtra("widgetId");

		FileManager fm = new FileManager(this);

		String mainfile = "index.html";
		html = fm.getStartFile(widgetId, mainfile);

		// LinearLayout layout = new LinearLayout(this);

		wv = new WebView(this);

		WebSettings webSettings = wv.getSettings();
		webSettings.setJavaScriptEnabled(true);
		webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
		webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
		webSettings.setSavePassword(false);
		webSettings.setSaveFormData(false);
		webSettings.setJavaScriptEnabled(true);
		webSettings.setSupportZoom(false);
		wv.setWebChromeClient(new MyWebChromeClient());

		wv.setWebViewClient(new WebViewClient() {
			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				super.onPageStarted(view, url, favicon);
			}

			@Override
			public void onPageFinished(WebView view, String url) {
				super.onPageFinished(view, url);
				layout.removeView(tv);
				layout.removeView(pb);
				Log.i("TEST", "widget Weergegeven");
			}

		});

		f = fm.getPreferenceFile(widgetId);
		XmlReader xml = new XmlReader(f);
		arg = xml.read();

		// transparante webview
		// wv.setBackgroundColor(0);

		bindBrowser(wv, f);

		// Dit werkt niet goed:
		// link:http://www.mail-archive.com/android-developers@googlegroups.com/msg13390.html
		// wv.loadData(html)

		wv.loadDataWithBaseURL("fake://fake.com", html, mimeType, encoding,
				null);

		// layout.setOrientation(LinearLayout.HORIZONTAL);
		// layout.removeAllViews();

		layout.addView(wv);

	}

	/**
	 * Methode die ervoor zorgt dat de juiste opties zichtbaar zijn in het menu
	 */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		super.onPrepareOptionsMenu(menu);
		menu.clear();

		menu.add("Exit");
		menu.add("Close Widget");

		if (!inSettings) {
			menu.add("Settings");
		} else {
			menu.add("Return");

		}
		// item.setIcon(R.drawable.paint);
		return true;
	}

	/**
	 * Zorg dat de juiste handelingen worden uitgevoerd bij het selecteren van
	 * een optie
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		super.onOptionsItemSelected(item);

		if (item.getTitle().equals("Exit")) {
			this.setResult(Global.SUBACTIVITY_RESULTCODE_CHAINCLOSE);
			this.finish();
		} else if (item.getTitle().equals("Close Widget")) {
			this.finish();
		}

		else if (item.getTitle().equals("Settings")) {
			inSettings = true;

			wv.loadDataWithBaseURL("Settings://widgetnaam", gap
					.generateSettings(arg, f), mimeType, encoding, null);
		} else if (item.getTitle().equals("Return")) {
			inSettings = false;

			wv.loadDataWithBaseURL("fake://fake.com", html, mimeType, encoding,
					null);
		}
		return true;
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		// don't reload the current page when the orientation is changed
		super.onConfigurationChanged(newConfig);
	}

	/**
	 * Methode die ervor zorgt dat de juiste JavaScript objecten aanwezig zijn
	 * binnen de webview
	 * 
	 * @param appView
	 * @param f
	 */
	private void bindBrowser(WebView appView, File f) {
		// FileInputStream fIn = openFileInput("preferences.xml");
		// FileOutputStream fOut =
		// openFileOutput("preferences1.xml",MODE_PRIVATE);

		// SETTINGS
		gap = new Settings(f);
		appView.addJavascriptInterface(gap, "Settings");

		// PHONEGAP
		phonegap = new PhoneGap(this, mHandler, appView);
		appView.addJavascriptInterface(phonegap, "DroidGap");

		HashMap<String, String> hash = arg;
		gap.setText(hash);
	}

	/**
	 * Provides a hook for calling "alert" from javascript. Useful for debugging
	 * your javascript.
	 */
	final class MyWebChromeClient extends WebChromeClient {
		@Override
		public boolean onJsAlert(WebView view, String url, String message,
				JsResult result) {
			Log.d(LOG_TAG, message);
			result.confirm();
			return true;
		}
	}

	/**
	 * Uitgevoerd wanneer de timer afloopt, nodig om een malding te kunnen geven
	 * aan de gebruiker als het laden langer duurt dan verwacht.
	 * 
	 * Blijkbaar een probleem met de nieuwe SDK update, textveld wordt niet geupdate
	 */
	public void updatecount() {

		//Log.i("TEST", "timer verlopen");
		//tv.setText("Laden duurt langer dan normaal, even geduld.");
	}

}